<?php
/**
 * bll viewfile
 * @package app-file_lib_bll
 */
load_lib('/bll/file');
/**
 * bll viewfile
 * @author pandajingjing
 * @package app-file_lib_bll
 */
class bll_viewfile extends bll_file{

	function __construct(){
		parent::__construct();
	}

	/**
	 * 查看图片
	 * @param string $p_strKey
	 * @param string $p_strExt
	 * @param string $o_strMimeType
	 * @param int $p_intWidth
	 * @param int $p_intHeight
	 * @param string $p_strOption
	 * @return object/false
	 */
	function viewFile($p_strKey,$p_strExt,&$o_strMimeType,$p_intWidth=0,$p_intHeight=0,$p_strOption=''){
		$arrFileInfo=dao_filedao::getFileDetail($p_strKey);
		$o_strMimeType='';
		if(NULL===$arrFileInfo){
			return false;
		}
		$p_strExt=strtolower($p_strExt);
		load_lib('/util/file');
		if($p_strExt==util_file::getExtension($arrFileInfo['MIMETYPE'])){
			$o_strMimeType=$arrFileInfo['MIMETYPE'];
			$arrImageType=dao_filedao::getConfig('image_type');
			if(in_array($p_strExt,$arrImageType)){
				if($p_intWidth>0 and $p_intHeight>0){ //尺寸图
					return $this->readSizedFile($p_strKey,$arrFileInfo['HOSTID'],$p_strExt,$p_intWidth,$p_intHeight,$p_strOption);
				}else{ //源图
					$arrShowOriginal=dao_filedao::getConfig('original','view');
					$bolGetIt=false;
					foreach($arrShowOriginal as $strPattern=>$bolShowOriginal){
						if(1===preg_match($strPattern,$this->_strDomain)){
							$bolGetIt=true;
							break;
						}
					}
					if($bolGetIt){
						if($bolShowOriginal){
							return $this->readOriginalFile($p_strKey,$arrFileInfo['HOSTID']);
						}else{
							return false;
						}
					}else{
						return false;
					}
				}
			}else{
				if($p_intWidth>0 or $p_intHeight>0){
					return false;
				}else{
					return $this->readOriginalFile($p_strKey,$arrFileInfo['HOSTID']);
				}
			}
		}else{
			return false;
		}
	}

	/**
	 * 读取原始文件
	 * @param string $p_strKey
	 * @param int $p_intHostID
	 * @return object/false
	 */
	protected function readOriginalFile($p_strKey,$p_intHostID){
		load_lib('/util/file');
		$strPath=$this->getOriginalPath($p_strKey,$p_intHostID);
		if(false===$strPath){
			return false;
		}else{
			return util_file::tryReadFile($strPath);
		}
	}

	/**
	 * 获取原始文件的存储路径
	 * @param string $p_strKey
	 * @param int $p_intHostID
	 * @return string/false
	 */
	protected function getOriginalPath($p_strKey,$p_intHostID){
		$strSubDir=$this->dispatchFile($p_strKey);
		load_lib('/dao/filedao');
		$strDesBaseDir=dao_filedao::getConfig('raw','storage');
		$strDesDir=$strDesBaseDir.DIRECTORY_SEPARATOR.$p_intHostID.$strSubDir;
		$strDesFilename=$strDesDir.$p_strKey;
		if(file_exists($strDesFilename)){
			return $strDesFilename;
		}else{
			$arrErrHostIDs=array( 
					$p_intHostID 
			);
			$arrFileBackup=dao_filedao::getFileBackup($p_strKey);
			if(NULL===$arrFileBackup){
				return false;
			}else{
				$arrBackHostIDs=explode(',',$arrFileBackup['BACKHOSTID']);
				foreach($arrBackHostIDs as $intHostID){
					if($intHostID==$p_intHostID){ //当前存储已经损坏
						continue;
					}
					$strDesDir=$strDesBaseDir.DIRECTORY_SEPARATOR.$intHostID.$strSubDir;
					$strDesFilename=$strDesDir.$p_strKey;
					if(file_exists($strDesFilename)){
						dao_filedao::addFileQueue(array( 
								'MSGTYPE'=>2,
								'FILEKEY'=>$p_strKey,
								'HOSTID'=>$intHostID,
								'ERRHOSTIDS'=>$arrErrHostIDs 
						)); //主要存储损坏需要重新备份
						dao_filedao::editFile(array( 
								'FILEKEY'=>$p_strKey,
								'HOSTID'=>$intHostID 
						)); //更新主要存储
						return $strDesFilename;
					}else{
						$arrErrHostIDs[]=$intHostID;
					}
				}
				dao_filedao::addFileQueue(array( 
						'MSGTYPE'=>3,
						'FILEKEY'=>$p_strKey 
				)); //所有备份均损坏需要删除相关数据
				return false;
			}
		}
	}

	/**
	 * 读取尺寸图
	 * @param string $p_strKey
	 * @param int $p_intHostID
	 * @param string $p_strExt
	 * @param int $p_intWidth
	 * @param int $p_intHeight
	 * @param string $p_strOption
	 * @return object
	 */
	protected function readSizedFile($p_strKey,$p_intHostID,$p_strExt,$p_intWidth,$p_intHeight,$p_strOption){
		$arrResizeConfig=dao_filedao::getConfig('resize','view');
		$bolGetIt=false;
		foreach($arrResizeConfig as $strPattern=>$arrConfig){
			if(1===preg_match($strPattern,$this->_strDomain)){
				$bolGetIt=true;
				break;
			}
		}
		if($bolGetIt){
			$arrResizeConfig=$arrConfig;
		}else{
			throw new Exception(__CLASS__.': configuration(resize) lost.');
			return false;
		}
		$bolGetIt=false;
		foreach($arrResizeConfig as $arrConfig){
			if($arrConfig['width']==$p_intWidth and $arrConfig['height']==$p_intHeight){
				$bolGetIt=true;
				if(''==$p_strOption){
					$arrOption=$arrConfig['option']['default'];
				}else{
					if(isset($arrConfig['option'][$p_strOption])){
						$arrOption=array_merge($arrConfig['option']['default'],$arrConfig['option'][$p_strOption]);
					}else{
						return false;
					}
				}
				break;
			}
		}
		if(!$bolGetIt){
			return false;
		}
		$strSubDir=$this->dispatchFile($p_strKey);
		$strDesBaseDir=dao_filedao::getConfig('resize','storage');
		$strDesDir=$strDesBaseDir.DIRECTORY_SEPARATOR.$p_intHostID.$strSubDir;
		$strDesFilename=$strDesDir.$p_strKey.'_'.$p_intWidth.'x'.$p_intHeight;
		if(''!==$p_strOption){
			$strDesFilename=$strDesFilename.'_'.$p_strOption;
		}
		if(file_exists($strDesFilename)){
			return util_file::tryReadFile($strDesFilename);
		}else{
			$objOriginalFile=$this->readOriginalFile($p_strKey,$p_intHostID);
			if(false===$objOriginalFile){
				return false;
			}else{
				load_lib('/util/image');
				$objImage=util_image::resizeImage($objOriginalFile,$p_intWidth,$p_intHeight,$p_strExt,$arrOption);
				if(!is_dir($strDesDir)){
					util_file::tryMakeDir($strDesDir,0755,true);
				}
				//util_file::tryWriteFile($strDesFilename,$objImage);
				return $objImage;
			}
		}
	}
}